// --------------------------------------------------------------------------------------------
// Version: MPL 1.1/GPL 2.0/LGPL 2.1
// 
// The contents of this file are subject to the Mozilla Public License Version
// 1.1 (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/
// 
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
// 
// <remarks>
// Generated by IDLImporter from file nsIRDFService.idl
// 
// You should use these interfaces when you access the COM objects defined in the mentioned
// IDL/IDH file.
// </remarks>
// --------------------------------------------------------------------------------------------
namespace Gecko
{
	using System;
	using System.Runtime.InteropServices;
	using System.Runtime.InteropServices.ComTypes;
	using System.Runtime.CompilerServices;
	
	
	/// <summary>
    /// The RDF service interface. This is a singleton object which should be
    /// obtained from the <code>nsServiceManager</code>.
    /// </summary>
	[ComImport()]
	[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
	[Guid("BFD05261-834C-11d2-8EAC-00805F29F370")]
	public interface nsIRDFService
	{
		
		/// <summary>
        /// Construct an RDF resource from a single-byte URI. <code>nsIRDFService</code>
        /// caches resources that are in-use, so multiple calls to <code>GetResource()</code>
        /// for the same <code>uri</code> will return identical pointers. FindResource
        /// is used to find out whether there already exists a resource corresponding to that url.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFResource GetResource([MarshalAs(UnmanagedType.LPStruct)] nsAUTF8StringBase aURI);
		
		/// <summary>
        /// Construct an RDF resource from a Unicode URI. This is provided
        /// as a convenience method, allowing automatic, in-line C++
        /// conversion from <code>nsString</code> objects. The <code>uri</code> will
        /// be converted to a single-byte representation internally.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFResource GetUnicodeResource([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "Gecko.CustomMarshalers.AStringMarshaler")] nsAStringBase aURI);
		
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFResource GetAnonymousResource();
		
		/// <summary>
        /// Construct an RDF literal from a Unicode string.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFLiteral GetLiteral([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "Gecko.CustomMarshalers.WStringMarshaler")] string aValue);
		
		/// <summary>
        /// Construct an RDF literal from a PRTime.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFDate GetDateLiteral(long aValue);
		
		/// <summary>
        /// Construct an RDF literal from an int.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFInt GetIntLiteral(int aValue);
		
		/// <summary>
        /// Construct an RDF literal from a data blob
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFBlob GetBlobLiteral(System.IntPtr aValue, int aLength);
		
		[return: MarshalAs(UnmanagedType.U1)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		bool IsAnonymousResource([MarshalAs(UnmanagedType.Interface)] nsIRDFResource aResource);
		
		/// <summary>
        /// Registers a resource with the RDF system, making it unique w.r.t.
        /// GetResource.
        ///
        /// An implementation of nsIRDFResource should call this in its
        /// Init() method if it wishes the resource to be globally unique
        /// (which is usually the case).
        ///
        /// @note that the resource will <i>not</i> be ref-counted by the
        /// RDF service: the assumption is that the resource implementation
        /// will call nsIRDFService::UnregisterResource() when the last
        /// reference to the resource is released.
        ///
        /// @note that the nsIRDFService implementation may choose to
        /// maintain a reference to the resource's URI; therefore, the
        /// resource implementation should ensure that the resource's URI
        /// (accessible via nsIRDFResource::GetValue(const char* *aURI)) is
        /// valid before calling RegisterResource(). Furthermore, the
        /// resource implementation should ensure that this pointer
        /// <i>remains</i> valid for the lifetime of the resource. (The
        /// implementation of the resource cache in nsIRDFService uses the
        /// URI maintained "internally" in the resource as a key into the
        /// cache rather than copying the resource URI itself.)
        /// </summary>
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		void RegisterResource([MarshalAs(UnmanagedType.Interface)] nsIRDFResource aResource, [MarshalAs(UnmanagedType.U1)] bool aReplace);
		
		/// <summary>
        /// Called to notify the resource manager that a resource is no
        /// longer in use. This method should only be called from the
        /// destructor of a "custom" resource implementation to notify the
        /// RDF service that the last reference to the resource has been
        /// released, so the resource is no longer valid.
        ///
        /// @note As mentioned in nsIRDFResourceFactory::CreateResource(),
        /// the RDF service will use the result of
        /// nsIRDFResource::GetValue() as a key into its cache. For this
        /// reason, you must always un-cache the resource <b>before</b>
        /// releasing the storage for the <code>const char*</code> URI.
        /// </summary>
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		void UnregisterResource([MarshalAs(UnmanagedType.Interface)] nsIRDFResource aResource);
		
		/// <summary>
        /// Register a <i>named data source</i>. The RDF service will call
        /// <code>nsIRDFDataSource::GetURI()</code> to determine the URI under
        /// which to register the data source.
        ///
        /// @note that the data source will <i>not</i> be refcounted by the
        /// RDF service! The assumption is that an RDF data source
        /// registers with the service once it is initialized (via
        /// <code>nsIRDFDataSource::Init()</code>), and unregisters when the
        /// last reference to the data source is released.
        /// </summary>
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		void RegisterDataSource([MarshalAs(UnmanagedType.Interface)] nsIRDFDataSource aDataSource, [MarshalAs(UnmanagedType.U1)] bool aReplace);
		
		/// <summary>
        /// Unregister a <i>named data source</i>. The RDF service will call
        /// <code>nsIRDFDataSource::GetURI()</code> to determine the URI under which the
        /// data source was registered.
        /// </summary>
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		void UnregisterDataSource([MarshalAs(UnmanagedType.Interface)] nsIRDFDataSource aDataSource);
		
		/// <summary>
        /// Get the <i>named data source</i> corresponding to the URI. If a data
        /// source has been registered via <code>RegisterDataSource()</code>, that
        /// data source will be returned.
        ///
        /// If no data source is currently
        /// registered for the specified URI, and a data source <i>constructor</i>
        /// function has been registered via <code>RegisterDatasourceConstructor()</code>,
        /// the RDF service will call the constructor to attempt to construct a
        /// new data source. If construction is successful, the data source will
        /// be initialized via <code>nsIRDFDataSource::Init()</code>.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFDataSource GetDataSource([MarshalAs(UnmanagedType.LPStr)] string aURI);
		
		/// <summary>
        /// Same as GetDataSource, but if a remote/XML data source needs to be
        /// constructed, then this method will issue a <b>blocking</b> Refresh
        /// call on that data source.
        /// </summary>
		[return: MarshalAs(UnmanagedType.Interface)]
		[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
		nsIRDFDataSource GetDataSourceBlocking([MarshalAs(UnmanagedType.LPStr)] string aURI);
	}
}
